iT邦幫忙

2022 iThome 鐵人賽

DAY 7
0

看似只是消除方塊而已,邏輯複雜到我開始懷疑自己...
這邊我能力不足,沒辦法完成道具生成的功能,只好將就一下把方塊消除就好了,反正重點還是後面的影像辨識和外掛
說起來都Day7了還在寫小遊戲真的很糟

首先先分成兩個部分,分別是橫的與直的兩種,接下來遍歷每個方塊,並且去尋找橫的與直的是否有無湊齊三塊以上

這種找法到最後會長這樣

x_match=[[0,0],[1,0],[2,0]]
y_match=[[0,0],[0,1],[0,2]]

如果想要做道具功能,就必須把這兩個資料合併在一起變這樣

match=[[0,0],[1,0],[2,0],[0,1],[0,2]]

但目前我還不知道要怎麼去合併,以後如果有空再回來想想看

那就可以開始來寫尋找方塊的邏輯了,這邊也有用到遞迴去尋找下一個方塊

check_is_matched_x = []
check_is_matched_y = []
match_x = []
match_y = []

def nextMatchX(self, x, y, x_count):
    if x + 1 < NUMGRID and self.getGemByPos(x, y).type == self.getGemByPos(x+1, y).type:
        # 尋找下一個
        self.nextMatchX(x+1, y, x_count+1)

    # match end
    else:
        # 找到連貫的方塊
        if x_count >= 2:
            m = []
            for mx in range(x - x_count, x + 1, 1):
                m.append([mx, y])
                self.check_is_matched_x.append([mx, y])
            self.match_x.append(m)
    return 

def nextMatchY(self, x, y, y_count):
    if y + 1 < NUMGRID and self.getGemByPos(x, y).type == self.getGemByPos(x, y+1).type:
        # 尋找下一個
        self.nextMatchY(x, y+1, y_count+1)

    # match end
    else:
        # 找到連貫的方塊
        if y_count >= 2:
            m = []
            for my in range(y - y_count, y + 1, 1):
                m.append([x, my])
                self.check_is_matched_y.append([x, my])
            self.match_y.append(m)
    return

再來測試看看

# 測試用
elif pygame.mouse.get_pressed()[2] == True:
    for x in range(NUMGRID):
        for y in range(NUMGRID):
            if [x, y] not in self.check_is_matched_x:
                self.nextMatchX(x, y, 0)
            if [x, y] not in self.check_is_matched_y:
                self.nextMatchY(x, y, 0)

    if self.match_x != []:
        for match_x in self.match_x:
            self.matches.append(match_x)

    if self.match_y != []:
        for match_y in self.match_y:
            self.matches.append(match_y)

    print(self.matches)

得到的這個self.matches就是配對結果囉

接下來就用上次的removeMatched來試一下

# 如果有方塊符合,則消除
if self.matches != [] and pygame.time.get_ticks() - match_ticks >= 500:
    self.removeMatched(self.matches)
    self.matches = []
    self.check_is_matched_x = []
    self.check_is_matched_y = []
    self.match_x = []
    self.match_y = []
    match_ticks = pygame.time.get_ticks()

到這邊其實有很多地方可以優化的,但畢竟我是小小的社畜,也很難有時間可以去優化它,就這樣給它爛吧

最後就是被消掉的方塊需要新增補上,並且要能自動配對與消除,希望明天可以把這個小遊戲完成


上一篇
Day6 讓方塊掉下來
下一篇
Day8 補上新拼圖和自動消除
系列文
最近迷上了三消遊戲 那就來寫一個自動消珠程式吧30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言